package com.tbynet.jwp.admin.post;

import com.jfinal.aop.Inject;
import com.jfinal.kit.Ret;
import com.jfinal.upload.UploadFile;
import com.tbynet.jwp.admin.AdminController;
import com.tbynet.jwp.service.spi.PostImportManager;
import com.tbynet.jwp.service.dto.imports.ImportConfig;
import com.tbynet.jwp.service.dto.imports.ImportHistory;
import com.tbynet.jwp.service.dto.imports.ImportProgress;
import com.tbynet.jwp.service.dto.imports.ImportResult;

/**
 * 文章导入控制器
 * @ClassName: PostImportController
 * @Description: 提供文章导入功能，支持CSV、XML、WordPress导出文件等多种格式
 * @Author: 佰亿互联
 * @Date: 2019年3月22日 下午3:05:05
 *
 * @Copyright: 2019 www.tbynet.com Inc. All rights reserved.
 * 注意: 本内容仅限于内部传阅，禁止外泄以及用于其他的商业目
 */
public class PostImportController extends AdminController {

    @Inject
    private PostImportManager postImportManager;

    /**
     * 导入页面
     * 显示文章导入界面和导入选项
     */
    public void index() {
        try {
            // 设置导入统计信息
            set("importStats", postImportManager.getImportStatistics());
            render("import.html");
        } catch (Exception e) {
            log.error("显示导入页面失败", e);
            renderError(500);
        }
    }

    /**
     * 处理文件上传和导入
     * 支持CSV、XML、WordPress导出文件等多种格式
     */
    public void upload() {
        try {
            UploadFile uploadFile = getFile("import_file");
            if (uploadFile == null) {
                fail("请选择要导入的文件");
                return;
            }

            String fileType = getPara("file_type", "csv");
            ImportConfig config = buildImportConfig();

            // 调用Manager层处理导入逻辑
            ImportResult result = postImportManager.importPosts(uploadFile.getFile(), fileType, config);

            // 删除临时文件
            uploadFile.getFile().delete();

            if (result.isSuccess()) {
                ok(Ret.by("msg", String.format("导入完成，成功导入 %d 篇文章，失败 %d 篇",
                                result.getImportedCount(), result.getErrorCount()))
                        .set("imported", result.getImportedCount())
                        .set("errors", result.getErrorCount())
                        .set("error_details", result.getErrors()));
            } else {
                fail("导入失败: " + result.getErrorMessage());
            }

        } catch (Exception e) {
            log.error("文章导入失败", e);
            fail("导入过程中发生错误: " + e.getMessage());
        }
    }

    /**
     * 下载导入模板
     * 提供CSV和XML格式的导入模板下载
     */
    public void downloadTemplate() {
        try {
            String templateType = getPara("type", "csv");
            String templatePath = postImportManager.getTemplatePath(templateType);

            if (templatePath != null) {
                renderFile(templatePath);
            } else {
                fail("不支持的模板类型: " + templateType);
            }
        } catch (Exception e) {
            log.error("下载导入模板失败", e);
            fail("下载模板失败: " + e.getMessage());
        }
    }

    /**
     * 检查导入进度
     * 用于长时间导入任务的进度查询
     */
    public void checkProgress() {
        try {
            String taskId = getPara("task_id");
            ImportProgress progress = postImportManager.getImportProgress(taskId);

            ok(Ret.by("progress", progress.getProgress())
                    .set("status", progress.getStatus())
                    .set("message", progress.getMessage()));
        } catch (Exception e) {
            log.error("检查导入进度失败", e);
            fail("检查进度失败: " + e.getMessage());
        }
    }

    /**
     * 获取导入历史
     * 显示最近的导入操作记录
     */
    public void history() {
        try {
            int page = getParaToInt("page", 1);
            int size = getParaToInt("size", 20);

            ImportHistory history = postImportManager.getImportHistory(page, size);
            ok(Ret.by("data", history.getRecords())
                    .set("total", history.getTotalCount()));
        } catch (Exception e) {
            log.error("获取导入历史失败", e);
            fail("获取导入历史失败: " + e.getMessage());
        }
    }

    /**
     * 构建导入配置
     * 根据请求参数构建导入配置对象
     */
    private ImportConfig buildImportConfig() {
        ImportConfig config = new ImportConfig();

        // 设置导入选项
        config.setAuthor(getPara("author", getLoginUser().getID().toString()));
        config.setDefaultStatus(getPara("default_status", "draft"));
        config.setImportCategories(getParaToBoolean("import_categories", true));
        config.setImportTags(getParaToBoolean("import_tags", true));
        config.setUpdateExisting(getParaToBoolean("update_existing", false));
        config.setDryRun(getParaToBoolean("dry_run", false));

        return config;
    }
}
